package com.imut.lagain.service;

import com.imut.lagain.entity.Notification;
import com.imut.lagain.entity.NotificationTemplate;
import org.springframework.http.ResponseEntity;

import java.util.Map;

/**
 * 微信通知服务接口
 */
public interface WechatNotificationService {
    
    /**
     * 发送模板消息
     * @param notification 通知对象
     * @param template 通知模板
     * @param data 模板数据
     * @return 是否发送成功
     */
    boolean sendTemplateMessage(Notification notification, NotificationTemplate template, Map<String, Object> data);
    
    /**
     * 发送文本消息
     * @param openId 用户OpenID
     * @param content 消息内容
     * @return 是否发送成功
     */
    boolean sendTextMessage(String openId, String content);
    
    /**
     * 发送图片消息
     * @param openId 用户OpenID
     * @param mediaId 媒体ID
     * @return 是否发送成功
     */
    boolean sendImageMessage(String openId, String mediaId);
    
    /**
     * 发送语音消息
     * @param openId 用户OpenID
     * @param mediaId 媒体ID
     * @return 是否发送成功
     */
    boolean sendVoiceMessage(String openId, String mediaId);
    
    /**
     * 发送视频消息
     * @param openId 用户OpenID
     * @param mediaId 媒体ID
     * @param title 视频标题
     * @param description 视频描述
     * @return 是否发送成功
     */
    boolean sendVideoMessage(String openId, String mediaId, String title, String description);
    
    /**
     * 发送音乐消息
     * @param openId 用户OpenID
     * @param title 音乐标题
     * @param description 音乐描述
     * @param musicUrl 音乐链接
     * @param hqMusicUrl 高质量音乐链接
     * @param thumbMediaId 缩略图媒体ID
     * @return 是否发送成功
     */
    boolean sendMusicMessage(String openId, String title, String description, String musicUrl, String hqMusicUrl, String thumbMediaId);
    
    /**
     * 发送图文消息
     * @param openId 用户OpenID
     * @param title 图文标题
     * @param description 图文描述
     * @param url 点击跳转链接
     * @param picUrl 图片链接
     * @return 是否发送成功
     */
    boolean sendNewsMessage(String openId, String title, String description, String url, String picUrl);
    
    /**
     * 获取Access Token
     * @return Access Token
     */
    String getAccessToken();
    
    /**
     * 刷新Access Token
     * @return 新的Access Token
     */
    String refreshAccessToken();
    
    /**
     * 上传临时素材
     * @param type 素材类型
     * @param filePath 文件路径
     * @return 素材ID
     */
    String uploadTempMedia(String type, String filePath);
    
    /**
     * 上传永久素材
     * @param type 素材类型
     * @param filePath 文件路径
     * @param title 标题
     * @param introduction 简介
     * @return 素材ID
     */
    String uploadPermanentMedia(String type, String filePath, String title, String introduction);
    
    /**
     * 获取用户信息
     * @param openId 用户OpenID
     * @return 用户信息
     */
    Map<String, Object> getUserInfo(String openId);
    
    /**
     * 创建菜单
     * @param menuJson 菜单JSON
     * @return 是否创建成功
     */
    boolean createMenu(String menuJson);
    
    /**
     * 删除菜单
     * @return 是否删除成功
     */
    boolean deleteMenu();
    
    /**
     * 获取菜单
     * @return 菜单信息
     */
    Map<String, Object> getMenu();
    
    /**
     * 设置行业
     * @param industryId1 行业ID1
     * @param industryId2 行业ID2
     * @return 是否设置成功
     */
    boolean setIndustry(String industryId1, String industryId2);
    
    /**
     * 获取模板ID
     * @param templateIdShort 模板短ID
     * @return 模板ID
     */
    String getTemplateId(String templateIdShort);
    
    /**
     * 获取所有私有模板
     * @return 模板列表
     */
    Map<String, Object> getAllPrivateTemplate();
    
    /**
     * 删除模板
     * @param templateId 模板ID
     * @return 是否删除成功
     */
    boolean deleteTemplate(String templateId);
    
    /**
     * 验证签名
     * @param signature 签名
     * @param timestamp 时间戳
     * @param nonce 随机数
     * @param token Token
     * @return 是否验证通过
     */
    boolean checkSignature(String signature, String timestamp, String nonce, String token);
    
    /**
     * 处理消息
     * @param xmlData XML数据
     * @return 响应内容
     */
    String handleMessage(String xmlData);
    
    /**
     * 处理事件
     * @param xmlData XML数据
     * @return 响应内容
     */
    String handleEvent(String xmlData);
}